package io.gitee.dqcer.mcdull.uac.provider.system.service.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import cn.hutool.core.collection.ListUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.gitee.dqcer.mcdull.uac.provider.common.config.RuoYiConfig;
import io.gitee.dqcer.mcdull.uac.provider.common.constant.ScheduleConstants;
import io.gitee.dqcer.mcdull.uac.provider.common.core.domain.model.LoginUser;
import io.gitee.dqcer.mcdull.uac.provider.common.utils.DateUtils;
import io.gitee.dqcer.mcdull.uac.provider.common.utils.SecurityUtils;
import io.gitee.dqcer.mcdull.uac.provider.common.utils.file.FileUploadUtils;
import io.gitee.dqcer.mcdull.uac.provider.common.utils.file.FileUtils;
import io.gitee.dqcer.mcdull.uac.provider.system.domain.SysOss;
import io.gitee.dqcer.mcdull.uac.provider.system.domain.vo.SysOssVO;
import io.gitee.dqcer.mcdull.uac.provider.system.mapper.SysFileMapper;
import io.gitee.dqcer.mcdull.uac.provider.system.service.ISysFileService;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件Service业务层处理
 *
 * @author ruoyi
 * @date 2023-12-09
 */
@Service
public class SysFileServiceImpl implements ISysFileService {
    @Autowired
    private SysFileMapper sysFileMapper;

    /**
     * 查询文件
     *
     * @param fileId 文件主键
     * @return 文件
     */
    @Override
    public SysOss selectSysFileByFileId(Long fileId) {
        return sysFileMapper.selectSysFileByFileId(fileId);
    }

    /**
     * 查询文件列表
     *
     * @param sysOss 文件
     * @return 文件
     */
    @Override
    public List<SysOssVO> selectSysFileList(SysOss sysOss) {
        List<SysOssVO> voList = new ArrayList<>();
        String path = RuoYiConfig.getUploadPath();
        List<SysOss> list = sysFileMapper.selectSysFileList(sysOss);
        for (SysOss oss : list) {
            SysOssVO vo = this.convertVO(oss);
            vo.setUrl(path + "/" + vo.getFileAliasName());
            voList.add(vo);
        }
        return voList;
    }

    private SysOssVO convertVO(SysOss oss) {
        SysOssVO sysOssVO = new SysOssVO();
        sysOssVO.setFileAliasName(oss.getFileAliasName());
        sysOssVO.setFileId(oss.getFileId());
        sysOssVO.setFileName(oss.getFileName());
        sysOssVO.setFileSize(oss.getFileSize());
        sysOssVO.setStatus(oss.getStatus());
        sysOssVO.setDelFlag(oss.getDelFlag());
        sysOssVO.setSearchValue(oss.getSearchValue());
        sysOssVO.setCreateBy(oss.getCreateBy());
        sysOssVO.setCreateTime(oss.getCreateTime());
        sysOssVO.setUpdateBy(oss.getUpdateBy());
        sysOssVO.setUpdateTime(oss.getUpdateTime());
        sysOssVO.setRemark(oss.getRemark());
        sysOssVO.setParams(oss.getParams());
        return sysOssVO;
    }

    /**
     * 新增文件
     *
     * @param sysOss 文件
     * @return 结果
     */
    @Override
    public int insertSysFile(SysOss sysOss) {
        sysOss.setCreateTime(DateUtils.getNowDate());
        return sysFileMapper.insertSysFile(sysOss);
    }

    /**
     * 修改文件
     *
     * @param sysOss 文件
     * @return 结果
     */
    @Override
    public int updateSysFile(SysOss sysOss) {
        sysOss.setUpdateTime(DateUtils.getNowDate());
        return sysFileMapper.updateSysFile(sysOss);
    }

    /**
     * 批量删除文件
     *
     * @param fileIds 需要删除的文件主键
     * @return 结果
     */
    @Override
    public int deleteSysFileByFileIds(Long[] fileIds) {
        List<Long> idList = Arrays.asList(fileIds);
        this.deleteFile(idList);
        return sysFileMapper.deleteSysFileByFileIds(fileIds);
    }

    private void deleteFile(List<Long> idList) {
        LambdaQueryWrapper<SysOss> query = Wrappers.lambdaQuery();
        query.in(SysOss::getFileId, idList);
        List<SysOss> list = sysFileMapper.selectList(query);
        List<String> fileNameList = list.stream().map(SysOss::getFileAliasName)
                .collect(Collectors.toList());
        for (String fileName : fileNameList) {
            String filePath = RuoYiConfig.getDownloadPath() + fileName;
            FileUtils.deleteFile(filePath);
        }
    }

    /**
     * 删除文件信息
     *
     * @param fileId 文件主键
     * @return 结果
     */
    @Override
    public int deleteSysFileByFileId(Long fileId) {
        this.deleteFile(ListUtil.of(fileId));
        return sysFileMapper.deleteSysFileByFileId(fileId);
    }

    @Override
    public void upload(MultipartFile file, String fileAliasName) {
        SysOss sysOss = new SysOss();
        sysOss.setCreateTime(DateUtils.getNowDate());
        LoginUser loginUser = SecurityUtils.getLoginUser();
        sysOss.setCreateBy(loginUser.getUsername());
        sysOss.setFileName(file.getOriginalFilename());
        sysOss.setFileAliasName(fileAliasName);
        sysOss.setFileSize(file.getSize());
        sysFileMapper.insertSysFile(sysOss);
    }
}
